/**
    * 封装 axios 请求模块
    */
import axios from "axios"
import store from "@/store"
// import router from "@/router"
import JSONBig from "json-bigint";

// const jsonStr = '{ "art_id": 12342424234434231132111 }'

// JSON.parse()
// JSON.stringify()

// JSONBig 可以处理数据中超出 JavaScript 安全整数范围的问题
// JSONBig.parse()  把 JSON 格式的字符串转为 JavaScript 对象
// 使用的时候需要把 BigNumber 类型的数据转为字符串来使用
// JSONBig.parse(jsonStr).art_id.toString()
// JSONBig.stringify()转换的话使用想对应的JSONBig.parse(jsonStr)
// 使用形式：JSONBig.stringify(JSONBig.parse(jsonStr))
// JSONBig.stringify() 把 JavaScript 对象 转为 JSON 格式字符串

const request = axios.create({
  baseURL: "http://geek.itheima.net", // 基础路径

  // 自定义后端返回的原始数据
  // data: 后端返回的原始数据，其实就是 JSON 格式的字符串
  transformResponse: [function (data) {
    try {
      return JSONBig.parse(data)
    } catch (err) {
      return data
    }
    // axios 默认会在内部这样来处理后端返回的数据
    // return JSON.parse(data)
  }]
})

// 请求拦截器 和 响应拦截器
// 请求拦截器 和 响应拦截器 是axios提供给我们使用的特色功能
// axios身上有一个属性是interceptors,它包含了所有的拦截器
// 找到对应请求拦截器request
// 使用（user）一个函数作为拦截器要做的事情
request.interceptors.request.use(function (config) {
  // 在请求拦截器函数终会有一个默认的形参config，config中包含了所有的请求配置信息
  if (store.state.user) {
    config.headers.Authorization = `Bearer ${store.state.user.token}`
  }
  // 注意：config对象必须return，否则会导致请求无法发送
  return config
}, function (error) {
  return Promise.reject(error)
})

//  响应拦截器
request.interceptors.response.use(function (response) {
  // console.log(response)
  return response
}, async function (err) {
  console.log(err)
  try {
    const { userToken } = store.state.user
    if (err.response.status === 401) {
      // 获取新的 token
      const { data: { data: { token } } } = await axios(
        {
          url: 'http://geek.itheima.net/v1_0/authorizations',
          method: 'PUT',
          headers: {
            Authorization: `Bearer ${userToken.refresh_token}`
          }
        }
      )
      // console.log(token)
      store.commit('user/setUser', {
        token: token, // 最新获取的可用 token
        refresh_token: userToken.refresh_token
      })
      // 重新发送请求
      return request(err.config)
    } else {
      router.push('/login')
    }
  } catch (err) {
    console.log(err)
  }
  return Promise.reject(err)
})
export default request
